<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>闭包</title>
</head>

<body>
    <h1>什么是闭包？函数嵌套函数，内部函数被外部函数返回并保存下来时，就会产生闭包。</h1>
    <h3>具体来说，闭包是一个函数以及该函数能够访问的外部变量集合，这些外部变量包括函数定义时所在的作用域以及在函数执行过程中动态创建的变量，闭包是的函数可以继续访问其词法作用域中变量，即使函数执行完毕后，这些变量的作用域已经消失
    </h3>
    <h3>特点：可以重复利用变量，并且这个变量不会污染全局的一种机制，这个变量时一直保存在内存中，不会被垃圾回收机制回收；</h3>
    <h3>缺点：闭包比较多的时候会消耗内存，导致页面性能下降，在IE浏览器中才会导致内存泄漏</h3>
    <h3>使用场景：防抖，节流，函数嵌套函数避免全局污染</h3>

    <dl>
        <dt><b>闭包有两个关键的特性</b></dt>
        <dd>1. 函数嵌套：闭包是通过函数内部定义的函数创建的，内部函数可以访问外部函数的变量和参数。</dd>
        <dd>2. 作用域链：当内部函数引用外部函数变量时，JS 引擎会沿着作用域链查找这些变量，直到找到为止。</dd>
    </dl>

    <dl>
        <dt><b>闭包的常见应用常见包括：</b></dt>
        <dd>封装私有变量：通过闭包，可以创建一个外部无法直接访问的内部作用域，从而封装私有变量，实现信息隐藏和数据保护。</dd>
        <dd>模块化开发：使用闭包可以实现模块化的代码结构，将相关功能和数据组织在一起，避免全局命名冲突，并提供外部访问和使用的接口。</dd>
        <dd>延迟执行：通过闭包可以创建延迟执行的函数，将某个操作推荐到合适的时机执行，常见的应用是事件处理。</dd>
    </dl>
    <script>
        function fn(a) {
            var b = '内部变量'
            return function () {
                console.log(a, b);
            }
        }

        var fo = fn('abcd')

        fo()

        var fo = fn('123456')

        fo()
    </script>
</body>

</html>